//
//  ModuleModel.m
//  Game2048
//
//  Created by tarena on 16/3/29.
//  Copyright © 2016年 tarena. All rights reserved.
//

#import "ModuleModel.h"

@implementation ModuleModel

- (void)moduleUp{
    //假设本次不能发生移动或合并
    IS_MOVE_MGER = false;
    for (UInt8 col = 0; col < 4; col++) {
        for (UInt8 row = 1; row < 4; row++) {
            if (!moduleData[row][col]) continue;
            
            //用来记录最终要移动的位置
            UInt8 move_end = UINT8_MAX;
            
            //一旦找到非空位置，就是最终要移动到的位置
            for (UInt8 index = row - 1; index < UINT8_MAX; index--) {
                if (0 == moduleData[row][col]) {
                    move_end = index;
                }else{
                    break;
                }
            }
            
            if (UINT8_MAX == move_end) {
                continue;
            }
            
            [self.delegate moduleMoveDestRow:move_end DesrCol:col SrcRow:row SrcCol:col];
            moduleData[move_end][col] = moduleData[row][col];
            moduleData[row][col] = 0;
            IS_MOVE_MGER = true;
            
        }

        for (UInt8 row = 0; row < 3; row++) {
            //合并的条件是，相等且不等于0
            if (moduleData[row][col] == moduleData[row+1][col] && moduleData[row][col]) {
                [self.delegate moduleMoveDestRow:row DesrCol:col SrcRow:row+1 SrcCol:col];
                moduleData[row][col] *= 2;
                
                moduleData[row+1][col] = 0;
                
                IS_MOVE_MGER = YES;
            }
        }
    }
    
    
    if (IS_MOVE_MGER) {
        [self moduleCreate];
    }
}


- (void *)loadModuleData{
    [self moduleCreate];
    return moduleData;
}

- (void)moduleCreate {
    //统计空位置的数量
    int nul_count = 0;
    for (UInt8 row = 0; row <  4; row++) {
        for (UInt8 col = 0; col < 4; col++) {
            nul_count += !moduleData[row][col];
        }
    }
    //只要有空白位置， 无论如何也创建出来
    while (nul_count) {
        UInt8 row = arc4random() % 4;
        UInt8 col = arc4random() % 4;
        if (!moduleData[row][col]) {
            moduleData[row][col] = 2;
            return;
        }
    }
}


@end
